package com.example.demo.basics.hashmap;

/**
 * @author aqua
 * @description
 *  * 逻辑 构建链表数组对象Entry  k v next  get set(插入相同获取需要用到并覆盖)
 *  * 构建方法put get
 *  * 算出hash算法 hashcode^(h>>>16) 散列均匀
 *  * put逻辑 先找到index下标 判断有没有 有循环则判断k是否重复 有覆盖      否插入
 *  * get 先找到index下标 判断有没有 有重复循环找到相等的k value
 *
 *  后续待更新扩容
 *  后续待更新红黑树 用treemap实现
 * @date 2020年11月03 0:56
 * @email 1301584033@qq.com
 */
public class MyHashMap<K,V> {
    private int size;//个数
    private int cap;//容量
    private Entry<K,V>[] table=null;

    public static void main(String[] args) {
        MyHashMap<String,String> hashMap=new MyHashMap<String,String> (16);
        hashMap.put("11","111");
        System.out.println(hashMap.get("11"));
    }
    public MyHashMap(int cap) {
        this.cap = cap;
        this.size=0;
        table=new Entry[cap];
    }
    public V put(K k,V v){
        int index=hash(k);
        Entry<K,V> newE=new Entry<>(k,v,index,null);
        Entry<K,V> hashE=table[index];
        while (hashE!=null){
            if(hashE.getK().equals(k)||k==hashE.getK()){
                hashE.setV(v);
            }
        }
        table[index]=new Entry<>(k,v,index,newE);
        return null;
    }
    public V get(K k){
        int index=hash(k);
        Entry<K,V> hashE=table[index];
        while (hashE!=null){
            if(hashE.getK().equals(k)||k==hashE.getK()){
               return hashE.getV();
            }
        }
        return null;
    }
    private int hash(K k){
        int h=0;
        if(k==null){
            h=0;
        }else{
            h=k.hashCode()^(1>>>16);
        }
        return Math.abs(h%cap);
    }
    class Entry<K,V>{
        K k;
        V v;
        int hash;
        Entry<K,V> next;

        public Entry(K k, V v, int hash, Entry<K, V> next) {
            this.k = k;
            this.v = v;
            this.hash = hash;
            this.next = next;
        }

        public K getK() {
            return k;
        }

        public V getV() {
            return v;
        }

        public void setV(V v) {
            this.v = v;
        }
    }
}
